package com.z.system.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import com.z.system.model.Log;
import com.z.system.repository.LogRepository;
import com.z.system.service.LogService;

import java.util.UUID;
import java.util.List;
import java.util.Date;

/**
 * 日志服务实现类，实现日志相关的业务操作
 */
@Service
public class LogServiceImpl implements LogService {

    @Autowired
    private LogRepository logRepository;

    /**
     * 异步保存日志
     * 使用@Async注解确保日志保存操作不会阻塞主业务流程
     */
    @Async
    @Override
    public void saveAsync(Log log) {
        // 设置创建时间
        if (log.getCreateTime() == null) {
            log.setCreateTime(new Date());
        }
        // 保存日志到数据库
        logRepository.save(log);
    }

    /**
     * 根据ID查询日志
     */
    @Override
    public Log findById(UUID id) {
        return logRepository.findById(id).orElse(null);
    }

    /**
     * 查询所有日志
     */
    @Override
    public List<Log> findAll() {
        return logRepository.findAll();
    }

    /**
     * 根据用户ID查询日志
     */
    @Override
    public List<Log> findByUserId(UUID userId) {
        return logRepository.findByUserId(userId);
    }

    /**
     * 根据模块查询日志
     */
    @Override
    public List<Log> findByModule(String module) {
        return logRepository.findByModule(module);
    }

    /**
     * 根据API路径查询日志
     */
    @Override
    public List<Log> findByApiPath(String apiPath) {
        return logRepository.findByApiPath(apiPath);
    }

    /**
     * 根据时间段查询日志
     */
    @Override
    public List<Log> findByCreateTimeBetween(Date startTime, Date endTime) {
        return logRepository.findByCreateTimeBetween(startTime, endTime);
    }

    /**
     * 根据状态码查询日志
     */
    @Override
    public List<Log> findByStatusCode(Integer statusCode) {
        return logRepository.findByStatusCode(statusCode);
    }

    /**
     * 查询包含错误信息的日志
     */
    @Override
    public List<Log> findErrorLogs() {
        return logRepository.findByErrorMsgIsNotNull();
    }

    /**
     * 删除日志
     */
    @Override
    public void delete(UUID id) {
        logRepository.deleteById(id);
    }

    /**
     * 批量删除日志
     */
    @Override
    public void deleteBatch(List<UUID> ids) {
        logRepository.deleteAllById(ids);
    }

    /**
     * 清空日志
     */
    @Override
    public void clearAll() {
        logRepository.deleteAll();
    }
}